spb/note-spboucher-ai
Public
1import { z } from "zod";2import { handler, parseBody, uuid } from "@/lib/api";3import { db, schema } from "@/db";4import { and, desc, eq } from "drizzle-orm";5import { getPage, updatePage } from "@/lib/pages/service";6import { audit } from "@/lib/audit";7export const GET = handler(async ({ ws, params, req }) => {8 const id = uuid.parse(params.id); await getPage(ws.id, id, { includeDeleted: true });9 const v = new URL(req.url).searchParams.get("v");10 if (v) { const [row] = await db.select().from(schema.pageVersions).where(and(eq(schema.pageVersions.pageId, id), eq(schema.pageVersions.version, Number(v)))); return Response.json(row ?? null); }11 return Response.json(await db.select({ id: schema.pageVersions.id, version: schema.pageVersions.version, title: schema.pageVersions.title, reason: schema.pageVersions.reason, createdAt: schema.pageVersions.createdAt, wordCount: schema.pageVersions.wordCount }).from(schema.pageVersions).where(eq(schema.pageVersions.pageId, id)).orderBy(desc(schema.pageVersions.version)).limit(200));12});13/** POST { version } → restore that snapshot (current state is saved as a version first). */14export const POST = handler(async ({ ws, params, req, user }) => {15 const id = uuid.parse(params.id); const { version } = await parseBody(req, z.object({ version: z.number().int() }));16 const [row] = await db.select().from(schema.pageVersions).where(and(eq(schema.pageVersions.pageId, id), eq(schema.pageVersions.version, version)));17 if (!row) return Response.json({ error: "Version not found" }, { status: 404 });18 const p = await updatePage(ws.id, id, { title: row.title, content: row.content as any, properties: (row.properties ?? {}) as any }, { versionReason: `restore v${version}` });19 await audit(user.id, "page.restore_version", { type: "page", id }, { version });20 return Response.json({ ok: true, version: p.version });21});22